import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

// 创建SparkSession
val spark = SparkSession.builder
val sc = spark.sparkContext

// 步骤一：创建并加载数据
// 使用Spark读取文本文件，创建一个RDD
val rawTextRDD = spark.sparkContext.textFile("employee_data.txt")

// 显示原始RDD的前几行数据以验证数据加载正确
rawTextRDD.take(5).foreach(println)

// 步骤二：RDD转换为DataFrame
// 定义案例类，用于通过反射推断DataFrame的Schema
case class Employee(ID: Int, name: String, age: Int, gender: String, joinDate: String)

// 使用map将文本行分割并转换为Employee对象，然后转换为DataFrame
val employeeRDD = rawTextRDD.map(_.split(",")).map(e => Employee(e(0).toInt, e(1), e(2).toInt, e(3), e(4)))
val employeeDF = employeeRDD.toDF()

// 显示DataFrame的Schema和前几行数据
employeeDF.printSchema()
employeeDF.show(5)

// 步骤三：DataFrame操作
// 使用DataFrame API进行数据清洗和分析操作
// 将“入职日期”列转换为日期类型
val dateFormattedDF = employeeDF.withColumn("joinDate", to_date($"joinDate"))

// 计算公司员工的平均年龄
val avgAge = dateFormattedDF.agg(avg("age")).head().getDouble(0)
println(s"公司员工的平均年龄为：$avgAge")

// 按性别分组统计员工数量
val groupCountDF = dateFormattedDF.groupBy("gender").count()
groupCountDF.show()

// 查询女性员工数量
val femaleCount = dateFormattedDF.filter($"gender" === "Female").count()
println(s"公司女性员工数量：$femaleCount")

